﻿/////////////////////////////////////   
///文         件：FFPDUdecoding.cs   
///概         要：针对国内短信解码（USC2）   
///组成结构：包含四个函数：   
///       1、GetEverySMS(string   SMS)   
///       2、GetTelphone(string   SMS)   
///       3、GetDataTime(string   SMS)     
///       4、GetContent(string     SMS)         
////////////////////////////////////   
using System;
using System.Text;
namespace SMS
{
    ///   <summary>   
    ///   FPDUdecoding   的摘要说明。   
    ///   </summary>   
    public class PDUDecoder
    {
        public PDUDecoder()
        {

            //   TODO:   在此处添加构造函数逻辑   

        }

        ///   <summary>   
        ///   判断接受的短信是PDU格式还是TEXT格式   
        ///   </summary>   

        public bool IsPDU(string SMS)
        {
            if (SMS.Substring(40, 2) != "08")
                return false;
            return true;
        }

        ///   <summary>   
        ///   函数功能：短信内容提取   
        ///   函数名称：GetEverySMS(string   SMS)   
        ///   参         数：SMS   要进行提取的整个短信内容   
        ///   返   回   值：将多个短信内容拆分   
        ///   </summary>   

        public string[] GetEverySMS(string SMS)
        {
            char[] str = "/n".ToCharArray();
            string[] temp = SMS.Split(str);
            return temp;
        }

        ///   <summary>   
        ///   函数功能：提取短信的发送人电话号码   
        ///   函数名称：GetTelphone(string   SMS)   
        ///   参         数：SMS   要进行转换的整个短信内容   
        ///   返   回   值：电话号码   
        ///   </summary>   

        public string GetTelphone(string SMS)
        {
            string tel = SMS.Substring(26, 12);
            string s = "";
            for (int i = 0; i < 9; i += 2)
            {
                s += tel[i + 1];
                s += tel[i];
            }
            s += tel[tel.Length - 1];
            return s;
        }

        ///   <summary>   
        ///   函数功能：提取短信的发送时间   
        ///   函数名称：GetDataTime(string   SMS)   
        ///   参         数：SMS:要进行转换的整个短信内容   
        ///   返   回   值：发送时间   
        ///   </summary>   

        public string GetDataTime(string SMS)
        {
            string time = SMS.Substring(42, 12);
            string s = "";
            for (int i = 0; i < 11; i += 2)
            {
                s += time[i + 1];
                s += time[i];
            }
            string t = s.Substring(0, 2) + "年" + s.Substring(2, 2) + "月" + s.Substring(4, 2) + "日" + s.Substring(6, 2) + ":" + s.Substring(8, 2) + ":" + s.Substring(10, 2);
            return t;
        }

        ///   <summary>   
        ///   函数功能：提取短信的内容(PDU)   
        ///   函数名称：GetContent(string   SMS)   
        ///   参         数：SMS:要进行转换的整个短信内容   
        ///   返   回   值：短信内容   
        ///   </summary>   

        public string GetContent(string SMS)
        {
            string c = "";
            string len = SMS.Substring(56, 2);
            int length = System.Convert.ToInt16(len, 16);
            length *= 2;
            string content = SMS.Substring(58, length);
            for (int i = 0; i < length; i += 4)
            {
                string temp = content.Substring(i, 4);
                int by = System.Convert.ToInt16(temp, 16);
                char ascii = (char)by;
                c += ascii.ToString();
            }
            return c;
        }

        ///   <summary>   
        ///   函数功能：提取短信的TEXT内容(TEXT)   
        ///   函数名称：GetTextContent(string   SMS)   
        ///   参         数：SMS:要进行转换的整个短信内容   
        ///   返   回   值：短信内容   
        ///   </summary>   

        public string GetTextContent(string SMS)
        {
            string str = "";
            string c = "";
            byte by;
            char ascii;
            int i;
            SMS = SMS.Replace("/r", "");
            SMS = SMS.Replace("/n", "");
            string content = SMS.Substring(58);
            for (i = content.Length - 2; i >= 0; i -= 2)
            {
                by = Convert.ToByte(content.Substring(i, 2), 16);
                str += Convert.ToString(by, 2).PadLeft(8, '0');
            }
            for (i = str.Length - 7; i >= 0; i -= 7)
            {
                by = Convert.ToByte(str.Substring(i, 7), 2);
                ascii = (char)by;
                c += ascii.ToString();
            }
            return c;
        }
    }
}